import { compare, hashSync } from "bcrypt";
import { sign } from "jsonwebtoken";
import { NextRequest, NextResponse } from "next/server";
const mysql = require("mysql2/promise");
// 创建数据池
const pool = mysql.createPool({
  connectionLimit: 10,
  host: "127.0.0.1", // 数据库地址
  user: "root", // 数据库用户
  password: "123456", // 数据库密码
  database: "user_data", // 选中数据库
});

// 定义请求体的类型
interface LoginRequestBody {
  username: string;
  password: string;
}

export async function POST(request: NextRequest) {
  // 检查请求方法
  if (request.method !== "POST") {
    return NextResponse.json(
      { message: "Method Not Allowed" },
      { status: 405 }
    );
  }

  try {
    // 从连接池中获取连接
    const connection = await pool.getConnection();

    // 获取请求体的内容并进行类型断言
    const { username, password }: LoginRequestBody = await request.json();

    // 使用 SQL 查询判断用户是否存在
    const [rows] = await connection.query(
      "SELECT COUNT(*) AS userCount FROM user_info WHERE user_name = ?",
      [username]
    );

    // 判断数据库中是否有该用户
    let hasUser = rows[0].userCount > 0; // 如果 userCount > 0，表示用户存在
    let isValid = true;
    // 如果用户存在  就需要比对密码  不存在就直接存密码
    if (hasUser) {
      // 假设从数据库中获取到的 hashedPasswordFromDatabase
      // const hashedPasswordFromDatabase = "someHashedPassword"; // 这里你应该从数据库中获取对应用户的哈希密码
      const [userRecord] = await connection.query(
        "SELECT pass_word FROM user_info WHERE user_name = ?",
        [username]
      );
      const hashedPasswordFromDatabase = userRecord[0]?.pass_word;
      // 比较密码
      isValid = await compare(password, hashedPasswordFromDatabase);
    } else {
      // 如果用户不存在，则保存新用户
      const hashedPassword = await hashSync(password, 10);
      console.log("@@", hashedPassword);

      // 执行 INSERT 语句保存新用户
      await connection.query(
        "INSERT INTO user_info (user_name, pass_word,nick_name) VALUES (?, ?, ?)",
        [username, hashedPassword, username]
      );
      // console.log("新用户已保存:", username);
      isValid = true; // 假设新用户注册后密码有效
    }

    if (isValid) {
      // 密码验证通过，生成 JWT
      const token = sign({ username }, "secret_key", { expiresIn: "1h" });
      const response = NextResponse.json(
        { token, code: 200, message: "登录成功" },
        { status: 200 }
      );
      // 存储cookies到浏览器中
      response.cookies.set("Backstage-Token", token, {
        // httpOnly: true, // 只能通过 HTTP 请求访问，防止客户端脚本访问  设置这个前端通过js就访问不到了
        secure: process.env.NODE_ENV === "production", // 生产环境下启用 HTTPS
        maxAge: 60 * 60, // 设置 cookie 有效期为 1 小时
        path: "/", // 设置 cookie 的作用域路径
      });
      return response;
    } else {
      // 密码无效
      return NextResponse.json(
        { message: "密码无效", code: 401 },
        { status: 401 }
      );
    }
  } catch (error) {
    // 错误处理
    return NextResponse.json(
      {
        message: "Internal Server Error",
        error: error instanceof Error ? error.message : "Unknown error",
      },
      { status: 500 }
    );
  }
}
